package gob.osinerg.emergencia.dao;

import gob.osinerg.emergencia.bean.AccidenteGraveFinal;
import gob.osinerg.emergencia.bean.AccidenteGraveFinalAcCorrectiva;
import gob.osinerg.emergencia.bean.AccidenteGraveFinalArchivo;
import gob.osinerg.emergencia.bean.AccidenteGraveFinalCausa;
import gob.osinerg.emergencia.bean.AccidenteGraveFinalTestigo;
import gob.osinerg.emergencia.bean.AccidenteGravePreliminar;
import gob.osinerg.emergencia.bean.FormularioEmergenciaUnmay;

import java.io.File;
import java.io.InputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

public class AccidenteGraveFinalDAOImpl extends GenericDAOImpl implements AccidenteGraveFinalDAO{

	public void save(AccidenteGraveFinal bean, FormularioEmergenciaUnmay beanform) throws Exception {
		Session session = getSession();
		Transaction transaction = null;
		AccidenteGraveFinalTestigo testigo = null;
		AccidenteGraveFinalAcCorrectiva accionCorrectiva = null;
		AccidenteGraveFinalCausa causa = null;
		AccidenteGraveFinalArchivo archivo = null;
		DecimalFormat formateador = new DecimalFormat("0000");
		String idArchivo = null;
		
	    InputStream inputStream = null;
	    Properties properties = null;
	    Map map = null;
		String rutaFile = null;
		String pathFile = null;
		
		try {			
			transaction = session.beginTransaction();
			
			
		    inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("gob/osinerg/resources/parameter.properties");
		    properties = new Properties();
		    properties.load(inputStream);
		    map = properties;
		    pathFile = (String)map.get("directorio.archivos.emergencia.accidenteGraveFinal");
			
			if(beanform.getId() == null){
				beanform.setId(getNextPK("FRM_EMR_UM_SEQ"));
			}
			
			if(bean.getId() == null || bean.getId().intValue() == 0){
				bean.setId(getNextPK("ACCDNTE_GRVE_FNAL_SEQ"));
			}
			
			if(bean.getIdFormularioEmergencia()==null) {
				if(beanform.getNmroEmrgncia() == null){
					beanform.setNmroEmrgncia(bean.getPreliminar().getIdFormato());
				}
				if(bean.getFlagTemporal().equals("SI")){
					beanform.setFlagTemporal("SI");
				}else{
					beanform.setFlagTemporal("NO");
				}
				session.saveOrUpdate(beanform);
				bean.setIdFormularioEmergencia(beanform.getId());
			}
		
		    idArchivo = "F4"+formateador.format(bean.getId());
		    
			if(bean.getCroquis() != null){
				rutaFile = pathFile + File.separator + idArchivo+"_"+bean.getCroquis().getFileName();
				bean.setRutaCroquis(rutaFile);
			}
			
			if(bean.getFotografias() != null){
				rutaFile = pathFile + File.separator + idArchivo+"_"+bean.getFotografias().getFileName();
				bean.setRutaFotografias(rutaFile);
			}
			
			if(bean.getAnalisisTrabajo() != null){
				rutaFile = pathFile + File.separator + idArchivo+"_"+bean.getAnalisisTrabajo().getFileName();
				bean.setRutaAnalisisTrabajo(rutaFile);
			}
			
			if(bean.getPartesMedicos() != null){
				rutaFile = pathFile + File.separator + idArchivo+"_"+bean.getPartesMedicos().getFileName();
				bean.setRutaPartesMedicos(rutaFile);
			}
			
			if(bean.getInformeInvestigacion() != null){
				rutaFile = pathFile + File.separator + idArchivo+"_"+bean.getInformeInvestigacion().getFileName();
				bean.setRutaInformeInvestigacion(rutaFile);
			}
			
			//insertar actualizar
			session.saveOrUpdate(bean);
			
			
			for(int i=0;i < bean.getListaTestigosAccidente().size();i++){
				testigo = (AccidenteGraveFinalTestigo)bean.getListaTestigosAccidente().get(i);
				if(testigo.getId() == null) {
					testigo.setId(getNextPK("ACCDNTE_GRVE_FNAL_TSTGOS_SEQ"));
					testigo.setIdFormularioEmergencia(bean.getId());
				}
				session.saveOrUpdate(testigo);
			}
			
			for(int i=0;i < bean.getListaAccionesCorrectivas().size();i++){
				accionCorrectiva = (AccidenteGraveFinalAcCorrectiva)bean.getListaAccionesCorrectivas().get(i);
				if(accionCorrectiva.getId()==null) {
					accionCorrectiva.setId(getNextPK("ACCDNTE_GRVE_FNAL_CCNES_SEQ"));
					accionCorrectiva.setIdFormularioEmergencia(bean.getId());
				}
				session.saveOrUpdate(accionCorrectiva);
			}
			
			for(int i=0;i < bean.getListaCondicionesSubstandares().size();i++){
				causa = (AccidenteGraveFinalCausa)bean.getListaCondicionesSubstandares().get(i);
				if(causa.getId()==null) {
					causa.setId(getNextPK("ACCDNTE_GRVE_FNAL_CSAS_SEQ"));
					causa.setIdFormularioEmergencia(bean.getId());
				}
				session.saveOrUpdate(causa);
			}
			
			for(int i=0;i < bean.getListaActosSubstandares().size();i++){
				causa = (AccidenteGraveFinalCausa)bean.getListaActosSubstandares().get(i);
				if(causa.getId()==null) {
					causa.setId(getNextPK("ACCDNTE_GRVE_FNAL_CSAS_SEQ"));
					causa.setIdFormularioEmergencia(bean.getId());
				}
				session.saveOrUpdate(causa);
			}
			
			for(int i=0;i < bean.getListaFactoresPersonales().size();i++){
				causa = (AccidenteGraveFinalCausa)bean.getListaFactoresPersonales().get(i);
				if(causa.getId()==null) {
					causa.setId(getNextPK("ACCDNTE_GRVE_FNAL_CSAS_SEQ"));
					causa.setIdFormularioEmergencia(bean.getId());
				}
				session.saveOrUpdate(causa);
			}
			
			for(int i=0;i < bean.getListaFactoresTrabajo().size();i++){
				causa = (AccidenteGraveFinalCausa)bean.getListaFactoresTrabajo().get(i);
				if(causa.getId()==null) {
					causa.setId(getNextPK("ACCDNTE_GRVE_FNAL_CSAS_SEQ"));
					causa.setIdFormularioEmergencia(bean.getId());
				}
				session.saveOrUpdate(causa);
			}
		    
			for(int i=0;i < bean.getListaOtrosArchivos().size();i++){
				archivo = (AccidenteGraveFinalArchivo)bean.getListaOtrosArchivos().get(i);
				if(archivo.getId()==null) {
					archivo.setId(getNextPK("ACCDNTE_GRVE_FNAL_RCHVOS_SEQ"));
					archivo.setIdFormularioEmergencia(bean.getId());
					rutaFile = pathFile + File.separator + idArchivo+"_"+archivo.getArchivo().getFileName();
					archivo.setRuta(rutaFile);
				}
				session.saveOrUpdate(archivo);
			}

			transaction.commit();
			
		} catch (Exception e) {
			transaction.rollback();
			throw e;
		}finally{
			session.close();
		}
	}

    public Long getNextPK(String sequence) throws Exception {
        long result = 1;

        StringBuffer sql = new StringBuffer("");
        sql.append("SELECT ");
        sql.append(sequence);
        sql.append(".NEXTVAL AS ID FROM DUAL");        
        
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            pstmt = getSession().connection().prepareStatement(sql.toString());
            rs = pstmt.executeQuery();
            if(rs.next()) {
                result = rs.getLong(1);
            }
            pstmt.close();
            pstmt = null;
            rs.close();
            rs = null;
        }
        catch(Exception e) {
            log.error(e.getMessage());
            if(pstmt != null) {
                try {pstmt.close();} catch(Exception ignore) {}
            }
            if(rs != null) {
            	try {rs.close();}catch(Exception ignore) {}
            }
        }
        return new Long(result);
    }
    
    
    public List findAccidenteGravePreliminar(String usrioCrdor, Long frmlarioId) throws Exception {			
		
		 String hql = " select s from " +
		 			  " AccidenteGravePreliminar s " +
		 			  " where s.id not in (" +
		 			  " select pre.id from AccidenteGravePreliminar pre,  AccidenteGraveFinal fi " +
		 			  " where pre.id = fi.preliminar.id)" +
		 			  " order by s.id " ;

		 Query query = getSession().createQuery(hql);
		
		return query.list();
	}
    
    public List findAccidenteGraveFinal(String usrioCrdor, Long frmlarioId) throws Exception {			
		
		 String hql = " select s from " +
		 			  " AccidenteGraveFinal s " +
		 			  " where s.flagTemporal = 'SI' " +
		 			  " order by s.id " ;

		 Query query = getSession().createQuery(hql);
		
		return query.list();
	}
	
	public AccidenteGravePreliminar findAccidenteGravePreliminar(Long id) throws Exception {			
		Criteria criteria = getSession().createCriteria(AccidenteGravePreliminar.class);
		criteria.add(Restrictions.eq("id",id));
		
		return (AccidenteGravePreliminar)criteria.uniqueResult();
	}
	
	public AccidenteGraveFinal findAccidenteGraveFinal(Long id)	throws Exception {
		AccidenteGraveFinal accGraveFinal = null;
		
		Criteria criteria = getSession().createCriteria(AccidenteGraveFinal.class);
		criteria.add(Restrictions.eq("id",id));
		accGraveFinal = (AccidenteGraveFinal)criteria.uniqueResult();
		
		Criteria criteriaTestigos = getSession().createCriteria(AccidenteGraveFinalTestigo.class);
		criteriaTestigos.add(Restrictions.eq("idFormularioEmergencia",accGraveFinal.getId()));
		List listTestigos = criteriaTestigos.list();
		
		Criteria criteriaArchivos = getSession().createCriteria(AccidenteGraveFinalArchivo.class);
		criteriaArchivos.add(Restrictions.eq("idFormularioEmergencia",accGraveFinal.getId())); //ASI DEBE SER!
		List listArchivos = criteriaArchivos.list();
		
		Criteria criteriaAccCorre = getSession().createCriteria(AccidenteGraveFinalAcCorrectiva.class);
		criteriaAccCorre.add(Restrictions.eq("idFormularioEmergencia",accGraveFinal.getId()));
		List listAccCorrec = criteriaAccCorre.list();

		Criteria criteriaCausas = getSession().createCriteria(AccidenteGraveFinalCausa.class);
		criteriaCausas.add(Restrictions.eq("idFormularioEmergencia",accGraveFinal.getId()));
		List listCausas = criteriaCausas.list();
		
		List listaActosSubstandares = new ArrayList();
		List listaCondicionesSubstandares = new ArrayList();
		List listaFactoresPersonales = new ArrayList();
		List listaFactoresTrabajo = new ArrayList();
		
		for(int i=0; i<listCausas.size(); i++){
			AccidenteGraveFinalCausa a = new AccidenteGraveFinalCausa(); 
			a = (AccidenteGraveFinalCausa)listCausas.get(i);
			if( a.getIdRdcCausa().indexOf("01") == 0 ) {// acciones substandares
				listaActosSubstandares.add(a);
				continue;
			}
			if(a.getIdRdcCausa().indexOf("02") == 0 ) { // condiciones substandares
				listaCondicionesSubstandares.add(a);
				continue;
			}
			if(a.getIdRdcCausa().indexOf("03") == 0 ) { // factores personales
				listaFactoresPersonales.add(a);
				continue;
			}
			if(a.getIdRdcCausa().indexOf("04") == 0 ) { // factores de trabajo
				listaFactoresTrabajo.add(a);
				continue;
			}
		}
		if(accGraveFinal != null) {
			accGraveFinal.setListaActosSubstandares(listaActosSubstandares);
			accGraveFinal.setListaCondicionesSubstandares(listaCondicionesSubstandares);
			accGraveFinal.setListaFactoresPersonales(listaFactoresPersonales);
			accGraveFinal.setListaFactoresTrabajo(listaFactoresTrabajo);
			accGraveFinal.setListaTestigosAccidente(listTestigos);
			accGraveFinal.setListaAccionesCorrectivas(listAccCorrec);
			accGraveFinal.setListaOtrosArchivos(listArchivos);
		}
		
		return accGraveFinal;
	}

	public ArrayList getCausas(String causa, String tipo) throws Exception{
	    	ArrayList list = new ArrayList();
	    	StringBuffer sql = new StringBuffer("");
	        sql.append("SELECT trc.codigo, trc.codigo||'-'||trc.descripcion as descripcion from tablas_rdc_172_causas " +
	        		"trc where trc.causa='"+causa+"' and trc.tipo='"+tipo+"'");
	        PreparedStatement pstmt = null;
	        ResultSet rs = null;
	        try {
	            pstmt = getSession().connection().prepareStatement(sql.toString());
	            rs = pstmt.executeQuery();
	            while(rs.next()) {
	               	 Map map = new HashMap();
	               	 map.put("codigo", rs.getString(1));
	               	 map.put("descripcion", rs.getString(2));
	               	 list.add(map);
	            }
	            pstmt.close();
	            pstmt = null;
	            rs.close();
	            rs = null;
	        }
	        catch(Exception e) {
	            log.error(e.getMessage());
	            if(pstmt != null) {
	                try {pstmt.close();} catch(Exception ignore) {}
	            }
	            if(rs != null) {
	            	try {rs.close();}catch(Exception ignore) {}
	            }
	        }
	        return list;
	}
	
	public Map getTodasCausas() throws Exception{
		Map map = new HashMap();
    	StringBuffer sql = new StringBuffer("");
        sql.append("SELECT trc.codigo, trc.descripcion as descripcion from tablas_rdc_172_causas trc ");
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            pstmt = getSession().connection().prepareStatement(sql.toString());
            rs = pstmt.executeQuery();
            while(rs.next()) {
               	 map.put(rs.getString(1),rs.getString(2));
            }
            pstmt.close();
            pstmt = null;
            rs.close();
            rs = null;
        }
        catch(Exception e) {
            log.error(e.getMessage());
            if(pstmt != null) {
                try {pstmt.close();} catch(Exception ignore) {}
            }
            if(rs != null) {
            	try {rs.close();}catch(Exception ignore) {}
            }
        }
        return map;
	}

	@Override
	public Long obtenerIDAccidenteGraveFinal(Long idFormulario)
			throws Exception {
		// TODO Auto-generated method stub
		String hql = " select s.id from " +
	 			  " AccidenteGraveFinal s " +
	 			  " where s.idFormularioEmergencia ="+idFormulario;

	 Query query = getSession().createQuery(hql);
	
	 return Long.parseLong(query.uniqueResult().toString());
	}

}
